-- Copyright (c) 2007 Maksym Motornyy <mmotorny@gmail.com>
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.

module HPython.AbstractSyntaxTree where

import Data.Complex

-- TODO: remove Show instantiations

data Target
	= SingleTarget Expression
	| TupleTarget [Target]
	| ListTarget [Target]
	deriving Show

data Statement
	= AssignmentStatement [Target] [Expression]
	| ExpressionStatement [Expression]
	| IfStatement [(Expression, [Statement])] [Statement]
	| PrintStatement (Maybe Expression) [Expression] Bool
	deriving Show

data UnaryOperator
	= LogicalNotOperator
	| BitwiseNotOperator
	| UnaryPlusOperator
	| UnaryMinusOperator
	deriving Show

data BinaryOperator
	= LogicalAndOperator
	| LogicalOrOperator
	| BitwiseAndOperator
	| BitwiseOrOperator
	| BitwiseXorOperator
	| LeftShiftOperator
	| RightShiftOperator
	| AdditionOperator
	| SubtractionOperator
	| MultiplicationOperator
	| DivisionOperator
	| FloorDivisionOperator
	| ModuloOperator
	| PowerOperator
	deriving Show
	
data ComparisonOperator
	= LessOperator
	| GreaterOperator
	| EqualOperator
	| NotEqualOperator
	| LessOrEqualOperator
	| GreaterOrEqualOperator
	| IsOperator
	| IsNotOperator
	| InOperator
	| NotInOperator
	deriving Show
	
data Parameter
	= IdentifierParameter String
	| DefaultParameter Parameter Expression
	| ListParameter [Parameter]
	deriving Show
	
data Expression
	= IdentifierExpression String
	| BooleanLiteralExpression Bool
	| IntegerLiteralExpression Integer
	| FloatingPointLiteralExpression Double
	| ImaginaryLiteralExpression (Complex Double)
	| StringLiteralExpression String
	| ListExpression [Expression]
	| TupleExpression [Expression]
	| AttributeReferenceExpression Expression String
	| SubscriptionExpression Expression [Expression]
	| CallExpression Expression
	| UnaryExpression UnaryOperator Expression
	| BinaryExpression BinaryOperator Expression Expression
	| ComparisonExpression Expression [(ComparisonOperator, Expression)]
	| IfElseExpression Expression Expression Expression
	| LambdaExpression [Parameter] (Maybe String) (Maybe String) Expression
	deriving Show
